package main

import (
	"fmt"
	"strconv"
	"time"
)

type binlog struct {
	count int
	event string
}

var i int = 1

func master(transaction chan binlog) {
	for {
		transaction <- binlog{count: i, event: "commit_" + strconv.Itoa(i)}
		time.Sleep(1 * time.Second)
		i++
	}
}

func slave(transaction chan binlog, ack chan string) {
	for {
		relaylog := <-transaction
		fmt.Printf("get binlog: %d, event is %s\n", relaylog.count, relaylog.event)
		ack <- "ok"
	}
}

func main() {
	/*
		带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态，就是说发送端发送的数据可以放在缓冲区里面，可以等待接收端去获取数据，而不是立刻需要接收端去获取数据。
		不过由于缓冲区的大小是有限的，所以还是必须有接收端来接收数据的，否则缓冲区一满，数据发送端就无法再发送数据了。
		如果通道不带缓冲，发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲，发送方则会阻塞直到发送的值被拷贝到缓冲区内；
		如果缓冲区已满，则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。
	*/

	transaction := make(chan binlog, 100) // 缓冲通道，设置缓冲值100
	ack := make(chan string)
	// 利用go关键字起一个线程
	go master(transaction)
	// 利用go关键字再起一个线程
	go slave(transaction, ack)

	// 阻止主函数退出，等待两个goroutine执行完之后再退出
	for {
		fmt.Println(<-ack)
	}
}
